<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>随笔记录 | 寒冷如铁</title>
    <meta name="generator" content="VuePress 1.8.2">
    <link rel="icon" href="/blog/favicon.ico">
    <script language="javascript" type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script language="javascript" type="text/javascript" src="/blog/js/MouseClickEffect.js"></script>
    <meta name="description" content="好奇就尝试，喜欢就坚持！">
    <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
    
    <link rel="preload" href="/blog/assets/css/0.styles.01ca31a9.css" as="style"><link rel="preload" href="/blog/assets/js/app.0c46c7d8.js" as="script"><link rel="preload" href="/blog/assets/js/3.5679fe00.js" as="script"><link rel="preload" href="/blog/assets/js/1.8cdd2163.js" as="script"><link rel="preload" href="/blog/assets/js/33.e08324f8.js" as="script"><link rel="prefetch" href="/blog/assets/js/10.0b6ffd8d.js"><link rel="prefetch" href="/blog/assets/js/11.d27e4c34.js"><link rel="prefetch" href="/blog/assets/js/12.ba5bd991.js"><link rel="prefetch" href="/blog/assets/js/13.ab5bead7.js"><link rel="prefetch" href="/blog/assets/js/14.124a0dc3.js"><link rel="prefetch" href="/blog/assets/js/15.ac521310.js"><link rel="prefetch" href="/blog/assets/js/16.b32290db.js"><link rel="prefetch" href="/blog/assets/js/17.d65c6ccd.js"><link rel="prefetch" href="/blog/assets/js/18.0a7a10ef.js"><link rel="prefetch" href="/blog/assets/js/19.e0e5e91a.js"><link rel="prefetch" href="/blog/assets/js/20.bcc0e382.js"><link rel="prefetch" href="/blog/assets/js/21.59edea58.js"><link rel="prefetch" href="/blog/assets/js/22.8239cecf.js"><link rel="prefetch" href="/blog/assets/js/23.48516c82.js"><link rel="prefetch" href="/blog/assets/js/24.4e1a046f.js"><link rel="prefetch" href="/blog/assets/js/25.56c0a228.js"><link rel="prefetch" href="/blog/assets/js/26.fb764e02.js"><link rel="prefetch" href="/blog/assets/js/27.f96c7435.js"><link rel="prefetch" href="/blog/assets/js/28.31139fa0.js"><link rel="prefetch" href="/blog/assets/js/29.fa31f05f.js"><link rel="prefetch" href="/blog/assets/js/30.49c791b1.js"><link rel="prefetch" href="/blog/assets/js/31.68660a8e.js"><link rel="prefetch" href="/blog/assets/js/32.4e07e3b0.js"><link rel="prefetch" href="/blog/assets/js/34.9153a266.js"><link rel="prefetch" href="/blog/assets/js/35.49d3bb37.js"><link rel="prefetch" href="/blog/assets/js/36.5a46a47a.js"><link rel="prefetch" href="/blog/assets/js/37.2403de70.js"><link rel="prefetch" href="/blog/assets/js/38.794a3bde.js"><link rel="prefetch" href="/blog/assets/js/39.185570eb.js"><link rel="prefetch" href="/blog/assets/js/4.a5921925.js"><link rel="prefetch" href="/blog/assets/js/40.b5ddc5b2.js"><link rel="prefetch" href="/blog/assets/js/41.81f131ab.js"><link rel="prefetch" href="/blog/assets/js/42.474cb45b.js"><link rel="prefetch" href="/blog/assets/js/43.fe269b94.js"><link rel="prefetch" href="/blog/assets/js/44.123909bf.js"><link rel="prefetch" href="/blog/assets/js/45.85e17df3.js"><link rel="prefetch" href="/blog/assets/js/46.96eb5367.js"><link rel="prefetch" href="/blog/assets/js/47.2c06ceb7.js"><link rel="prefetch" href="/blog/assets/js/48.dcaa5d75.js"><link rel="prefetch" href="/blog/assets/js/49.47475370.js"><link rel="prefetch" href="/blog/assets/js/5.a6bfa893.js"><link rel="prefetch" href="/blog/assets/js/50.29aa41a9.js"><link rel="prefetch" href="/blog/assets/js/51.b049cb19.js"><link rel="prefetch" href="/blog/assets/js/52.9f16a8d1.js"><link rel="prefetch" href="/blog/assets/js/53.9ccedc0d.js"><link rel="prefetch" href="/blog/assets/js/54.c16fde39.js"><link rel="prefetch" href="/blog/assets/js/55.3d2e78cc.js"><link rel="prefetch" href="/blog/assets/js/56.14b1dddb.js"><link rel="prefetch" href="/blog/assets/js/57.a48eb0da.js"><link rel="prefetch" href="/blog/assets/js/58.db985774.js"><link rel="prefetch" href="/blog/assets/js/59.dbb67461.js"><link rel="prefetch" href="/blog/assets/js/6.d5f7873e.js"><link rel="prefetch" href="/blog/assets/js/60.fd9edd5c.js"><link rel="prefetch" href="/blog/assets/js/61.c87eaa37.js"><link rel="prefetch" href="/blog/assets/js/62.09bd4303.js"><link rel="prefetch" href="/blog/assets/js/63.c3a4cb82.js"><link rel="prefetch" href="/blog/assets/js/64.1e623e6b.js"><link rel="prefetch" href="/blog/assets/js/65.5ee98079.js"><link rel="prefetch" href="/blog/assets/js/66.875fdeb3.js"><link rel="prefetch" href="/blog/assets/js/67.52e4feee.js"><link rel="prefetch" href="/blog/assets/js/68.09bb6522.js"><link rel="prefetch" href="/blog/assets/js/69.e5cc1032.js"><link rel="prefetch" href="/blog/assets/js/7.63c57787.js"><link rel="prefetch" href="/blog/assets/js/70.a2307508.js"><link rel="prefetch" href="/blog/assets/js/71.75bc515a.js"><link rel="prefetch" href="/blog/assets/js/72.f7d10a87.js"><link rel="prefetch" href="/blog/assets/js/73.ae777bb5.js"><link rel="prefetch" href="/blog/assets/js/74.ddd90b9a.js"><link rel="prefetch" href="/blog/assets/js/75.5d297adc.js"><link rel="prefetch" href="/blog/assets/js/76.299aaa21.js"><link rel="prefetch" href="/blog/assets/js/77.c93068f7.js"><link rel="prefetch" href="/blog/assets/js/78.727916c9.js"><link rel="prefetch" href="/blog/assets/js/79.605f2aff.js"><link rel="prefetch" href="/blog/assets/js/8.22284503.js"><link rel="prefetch" href="/blog/assets/js/80.0081929d.js"><link rel="prefetch" href="/blog/assets/js/9.8e870e00.js">
    <link rel="stylesheet" href="/blog/assets/css/0.styles.01ca31a9.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container" data-v-19557b78><div data-v-19557b78><div id="loader-wrapper" class="loading-wrapper" data-v-d48f4d20 data-v-19557b78 data-v-19557b78><div class="loader-main" data-v-d48f4d20><div data-v-d48f4d20></div><div data-v-d48f4d20></div><div data-v-d48f4d20></div><div data-v-d48f4d20></div></div> <!----> <!----></div> <div class="password-shadow password-wrapper-out" style="display:none;" data-v-64685f0e data-v-19557b78 data-v-19557b78><h3 class="title" style="display:none;" data-v-64685f0e data-v-64685f0e>寒冷如铁</h3> <!----> <label id="box" class="inputBox" style="display:none;" data-v-64685f0e data-v-64685f0e><input type="password" value="" data-v-64685f0e> <span data-v-64685f0e>Konck! Knock!</span> <button data-v-64685f0e>OK</button></label> <div class="footer" style="display:none;" data-v-64685f0e data-v-64685f0e><span data-v-64685f0e><i class="iconfont reco-theme" data-v-64685f0e></i> <a target="blank" href="https://vuepress-theme-reco.recoluan.com" data-v-64685f0e>vuePress-theme-reco</a></span> <span data-v-64685f0e><i class="iconfont reco-copyright" data-v-64685f0e></i> <a data-v-64685f0e><span data-v-64685f0e>寒铁</span>
            
          <span data-v-64685f0e>2020 - </span>
          2022
        </a></span></div></div> <div class="hide" data-v-19557b78><header class="navbar" data-v-19557b78><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/blog/" class="home-link router-link-active"><!----> <span class="site-name">寒冷如铁</span></a> <div class="links"><div class="color-picker"><a class="color-button"><i class="iconfont reco-color"></i></a> <div class="color-picker-menu" style="display:none;"><div class="mode-options"><h4 class="title">Choose mode</h4> <ul class="color-mode-options"><li class="dark">dark</li><li class="auto active">auto</li><li class="light">light</li></ul></div></div></div> <div class="search-box"><i class="iconfont reco-search"></i> <input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/blog/" class="nav-link"><i class="iconfont reco-home"></i>
  首页
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-category"></i>
      分类
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/categories/build/" class="nav-link"><i class="iconfont undefined"></i>
  build
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/db/" class="nav-link"><i class="iconfont undefined"></i>
  db
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/docker/" class="nav-link"><i class="iconfont undefined"></i>
  docker
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/workflow/" class="nav-link"><i class="iconfont undefined"></i>
  workflow
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/git/" class="nav-link"><i class="iconfont undefined"></i>
  git
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/java/" class="nav-link"><i class="iconfont undefined"></i>
  java
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/source/" class="nav-link"><i class="iconfont undefined"></i>
  source
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/linux/" class="nav-link"><i class="iconfont undefined"></i>
  linux
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/network/" class="nav-link"><i class="iconfont undefined"></i>
  network
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/python/" class="nav-link"><i class="iconfont undefined"></i>
  python
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/project/" class="nav-link"><i class="iconfont undefined"></i>
  project
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/share/" class="nav-link"><i class="iconfont undefined"></i>
  share
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/software/" class="nav-link"><i class="iconfont undefined"></i>
  software
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/spring/" class="nav-link"><i class="iconfont undefined"></i>
  spring
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/tomcat/" class="nav-link"><i class="iconfont undefined"></i>
  tomcat
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/web/" class="nav-link"><i class="iconfont undefined"></i>
  web
</a></li></ul></div></div><div class="nav-item"><a href="/blog/tag/" class="nav-link"><i class="iconfont reco-tag"></i>
  标签
</a></div><div class="nav-item"><a href="/blog/views/guide.html" aria-current="page" class="nav-link router-link-exact-active router-link-active"><i class="iconfont reco-other"></i>
  记录
</a></div><div class="nav-item"><a href="/blog/timeline/" class="nav-link"><i class="iconfont reco-date"></i>
  时间线
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-message"></i>
      外链
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://github.com/huhuhan" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-github"></i>
  GitHub
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://gitee.com/huhu_han" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-other"></i>
  Gitee
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://console.leancloud.app/#/apps" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-other"></i>
  有道云笔记
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://console.leancloud.app/#/apps" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-other"></i>
  LeadCloud
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://cloud.seafile.com/" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-other"></i>
  Seafile
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://huhu_han.gitee.io/downgit" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-other"></i>
  DownGit
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div> <!----></nav></div></header> <div class="sidebar-mask" data-v-19557b78></div> <aside class="sidebar" data-v-19557b78><div class="personal-info-wrapper" data-v-b038cec6><img src="/blog/avatar.png" alt="author-avatar" class="personal-img" data-v-b038cec6> <h3 class="name" data-v-b038cec6>
    寒铁
  </h3> <div class="num" data-v-b038cec6><div data-v-b038cec6><h3 data-v-b038cec6>66</h3> <h6 data-v-b038cec6>文章</h6></div> <div data-v-b038cec6><h3 data-v-b038cec6>17</h3> <h6 data-v-b038cec6>标签</h6></div></div> <hr data-v-b038cec6></div> <nav class="nav-links"><div class="nav-item"><a href="/blog/" class="nav-link"><i class="iconfont reco-home"></i>
  首页
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-category"></i>
      分类
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/categories/build/" class="nav-link"><i class="iconfont undefined"></i>
  build
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/db/" class="nav-link"><i class="iconfont undefined"></i>
  db
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/docker/" class="nav-link"><i class="iconfont undefined"></i>
  docker
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/workflow/" class="nav-link"><i class="iconfont undefined"></i>
  workflow
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/git/" class="nav-link"><i class="iconfont undefined"></i>
  git
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/java/" class="nav-link"><i class="iconfont undefined"></i>
  java
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/source/" class="nav-link"><i class="iconfont undefined"></i>
  source
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/linux/" class="nav-link"><i class="iconfont undefined"></i>
  linux
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/network/" class="nav-link"><i class="iconfont undefined"></i>
  network
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/python/" class="nav-link"><i class="iconfont undefined"></i>
  python
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/project/" class="nav-link"><i class="iconfont undefined"></i>
  project
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/share/" class="nav-link"><i class="iconfont undefined"></i>
  share
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/software/" class="nav-link"><i class="iconfont undefined"></i>
  software
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/spring/" class="nav-link"><i class="iconfont undefined"></i>
  spring
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/tomcat/" class="nav-link"><i class="iconfont undefined"></i>
  tomcat
</a></li><li class="dropdown-item"><!----> <a href="/blog/categories/web/" class="nav-link"><i class="iconfont undefined"></i>
  web
</a></li></ul></div></div><div class="nav-item"><a href="/blog/tag/" class="nav-link"><i class="iconfont reco-tag"></i>
  标签
</a></div><div class="nav-item"><a href="/blog/views/guide.html" aria-current="page" class="nav-link router-link-exact-active router-link-active"><i class="iconfont reco-other"></i>
  记录
</a></div><div class="nav-item"><a href="/blog/timeline/" class="nav-link"><i class="iconfont reco-date"></i>
  时间线
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-message"></i>
      外链
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://github.com/huhuhan" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-github"></i>
  GitHub
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://gitee.com/huhu_han" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-other"></i>
  Gitee
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://console.leancloud.app/#/apps" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-other"></i>
  有道云笔记
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://console.leancloud.app/#/apps" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-other"></i>
  LeadCloud
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://cloud.seafile.com/" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-other"></i>
  Seafile
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://huhu_han.gitee.io/downgit" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-other"></i>
  DownGit
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div> <!----></nav>  <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>随笔记录</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/blog/views/guide.html#快速上手一个项目" class="sidebar-link">快速上手一个项目</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/blog/views/guide.html#小技巧速记" class="sidebar-link">小技巧速记</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/blog/views/guide.html#word文档编辑" class="sidebar-link">Word文档编辑</a></li></ul></li><li><a href="/blog/views/guide.html#异常处理随手记" class="sidebar-link">异常处理随手记</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/blog/views/guide.html#端口网络中断" class="sidebar-link">端口网络中断</a></li></ul></li><li><a href="/blog/views/guide.html#文章阅读纪要" class="sidebar-link">文章阅读纪要</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/blog/views/guide.html#spring-bean-定义方式" class="sidebar-link">Spring Bean 定义方式</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#mysql-锁" class="sidebar-link">MySQL 锁</a></li></ul></li><li><a href="/blog/views/guide.html#速记专业概念" class="sidebar-link">速记专业概念</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/blog/views/guide.html#传参加密意义" class="sidebar-link">传参加密意义</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#响应时间" class="sidebar-link">响应时间</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#吞吐量" class="sidebar-link">吞吐量</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#并发用户数" class="sidebar-link">并发用户数</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#qps每秒查询率" class="sidebar-link">QPS每秒查询率</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#java平台" class="sidebar-link">Java平台</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#lru" class="sidebar-link">LRU</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#clickhouse" class="sidebar-link">clickHouse</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#服务器" class="sidebar-link">服务器</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#java语法糖" class="sidebar-link">JAVA语法糖</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#mom" class="sidebar-link">MOM</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#jms" class="sidebar-link">JMS</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#mq" class="sidebar-link">MQ</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#安全防护" class="sidebar-link">安全防护</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#cap" class="sidebar-link">CAP</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#iis" class="sidebar-link">IIS</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#docker" class="sidebar-link">docker</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#springboot特征" class="sidebar-link">SpringBoot特征</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#sass" class="sidebar-link">sass</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#sql" class="sidebar-link">SQL</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#activity" class="sidebar-link">activity</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#nacos​" class="sidebar-link">Nacos​</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#activemq" class="sidebar-link">activeMQ</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#zookeeper" class="sidebar-link">zookeeper</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#geoserver" class="sidebar-link">geoServer</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#postgresql" class="sidebar-link">postgreSql</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#webservice" class="sidebar-link">webservice</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#ldap" class="sidebar-link">LDAP：</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#jetty" class="sidebar-link">jetty</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#react" class="sidebar-link">React</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#redux" class="sidebar-link">Redux</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#语法糖" class="sidebar-link">语法糖</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#tomcat" class="sidebar-link">tomcat</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#maven" class="sidebar-link">maven</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#跨域方案" class="sidebar-link">跨域方案</a></li><li class="sidebar-sub-header"><a href="/blog/views/guide.html#webpack" class="sidebar-link">webpack</a></li></ul></li></ul></section></li></ul> </aside> <div class="password-shadow password-wrapper-in" style="display:none;" data-v-64685f0e data-v-19557b78><h3 class="title" style="display:none;" data-v-64685f0e data-v-64685f0e>随笔记录</h3> <!----> <label id="box" class="inputBox" style="display:none;" data-v-64685f0e data-v-64685f0e><input type="password" value="" data-v-64685f0e> <span data-v-64685f0e>Konck! Knock!</span> <button data-v-64685f0e>OK</button></label> <div class="footer" style="display:none;" data-v-64685f0e data-v-64685f0e><span data-v-64685f0e><i class="iconfont reco-theme" data-v-64685f0e></i> <a target="blank" href="https://vuepress-theme-reco.recoluan.com" data-v-64685f0e>vuePress-theme-reco</a></span> <span data-v-64685f0e><i class="iconfont reco-copyright" data-v-64685f0e></i> <a data-v-64685f0e><span data-v-64685f0e>寒铁</span>
            
          <span data-v-64685f0e>2020 - </span>
          2022
        </a></span></div></div> <div data-v-19557b78><main class="page"><div class="page-title" style="display:none;"><h1>随笔记录</h1> <hr> <div data-v-484a899e><i class="iconfont reco-account" data-v-484a899e><span data-v-484a899e>寒铁</span></i> <i class="iconfont reco-date" data-v-484a899e><span data-v-484a899e>2019-03-27</span></i> <i class="iconfont reco-eye" data-v-484a899e><span id="/blog/views/guide.html" data-flag-title="Your Article Title" class="leancloud-visitors" data-v-484a899e><a class="leancloud-visitors-count" style="font-size:.9rem;font-weight:normal;color:#999;"></a></span></i> <!----></div></div> <div class="theme-reco-content content__default" style="display:none;"><blockquote><p>博客说明，仅学习总结笔记角度看待，以使用总结为主，概念总结一般直接以外链为主</p></blockquote> <h2 id="快速上手一个项目"><a href="#快速上手一个项目" class="header-anchor">#</a> 快速上手一个项目</h2> <ol><li>熟悉项目所用框架技术，熟悉其规定的语法糖基本用法，建议通过官网文档学习；高级用法暂时忽略</li> <li>了解基本语法糖用法后，便可以阅读代码，梳理业务逻辑，建议整理代码模块的引用，添加代码注释</li> <li>基本业务逻辑整理后，可以进行具体调试，细节了解具体模块；</li> <li>具体模块中若用到高级用法、疑点等再查阅资料，这类一般通过博客资料快速查阅，有官方文档优先官方</li></ol> <h2 id="小技巧速记"><a href="#小技巧速记" class="header-anchor">#</a> 小技巧速记</h2> <h3 id="word文档编辑"><a href="#word文档编辑" class="header-anchor">#</a> Word文档编辑</h3> <p>编辑修改后，一定要<strong>另存为</strong>，可以减少很大的缓存空间，文件仅文本内容大小！！</p> <h2 id="异常处理随手记"><a href="#异常处理随手记" class="header-anchor">#</a> 异常处理随手记</h2> <h3 id="端口网络中断"><a href="#端口网络中断" class="header-anchor">#</a> 端口网络中断</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>问题描述：阿里云服务器的应用连接其他服务器的postgresql数据库，连接失败。
本质原因：服务器的网络端口出方向5432、22之类端口被禁网络
处理过程：
	1、检查服务器上项目配置，怀疑连接配置问题。否
	2、本地测试能连，怀疑服务器IP被数据库服务器禁用。否
	3、被告知服务器中病毒。
		1、根据提示删除病毒相关文件。（挖矿程序）
		2、原因是服务器刚装的测试用pg数据库，默认端口、账户被攻陷。
		3、删除pg数据库容器以及相关文件。
	4、问题未解决，
	5、将数据库服务器的数据库端口代理转发。可行，临时方案，保证应用可用。
	6、经过服务器重启、带宽升级等等，原端口仍然无法连接。
	7、第二天端口便恢复。
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><h2 id="文章阅读纪要"><a href="#文章阅读纪要" class="header-anchor">#</a> 文章阅读纪要</h2> <blockquote><p>如公众号看到的好文章，作个总结纪要，点击标题可跳转链接</p></blockquote> <h3 id="spring-bean-定义方式"><a href="#spring-bean-定义方式" class="header-anchor">#</a> <a href="https://mp.weixin.qq.com/s/LJ1XfCUNhvaAyqLGTKb3aA" target="_blank" rel="noopener noreferrer">Spring Bean 定义方式<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code>xml配置bean。spring2<span class="token punctuation">.</span><span class="token number">5</span>前的方式
<span class="token number">1.</span> 构造器：无参、有参
<span class="token operator">&lt;</span>bean id<span class="token operator">=</span><span class="token string">&quot;personService&quot;</span> class<span class="token operator">=</span><span class="token string">&quot;com.yh.demo.xx.Demo&quot;</span><span class="token operator">&gt;</span>
	<span class="token operator">&lt;</span>constructor<span class="token operator">-</span>arg index<span class="token operator">=</span><span class="token string">&quot;0&quot;</span> value<span class="token operator">=</span><span class="token string">&quot;name&quot;</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>constructor<span class="token operator">-</span>arg<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>bean<span class="token operator">&gt;</span>

<span class="token number">2.</span> setter方法
<span class="token operator">&lt;</span>bean id<span class="token operator">=</span><span class="token string">&quot;personService&quot;</span> class<span class="token operator">=</span><span class="token string">&quot;com.yh.demo.xx.Demo&quot;</span><span class="token operator">&gt;</span>
	<span class="token operator">&lt;</span>property name<span class="token operator">=</span><span class="token string">&quot;name&quot;</span> value<span class="token operator">=</span><span class="token string">&quot;yh&quot;</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>property<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>bean<span class="token operator">&gt;</span>

<span class="token number">3.</span> 静态工厂方法：工厂类指定生成类的方法。无参、有参
<span class="token operator">&lt;</span>bean class<span class="token operator">=</span><span class="token string">&quot;com.yh.demo.xx.DemoBeanFactory&quot;</span> factory<span class="token operator">-</span>method<span class="token operator">=</span><span class="token string">&quot;createDemo&quot;</span><span class="token operator">&gt;</span>
	<span class="token operator">&lt;</span>constructor<span class="token operator">-</span>arg index<span class="token operator">=</span><span class="token string">&quot;0&quot;</span> value<span class="token operator">=</span><span class="token string">&quot;name&quot;</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>constructor<span class="token operator">-</span>arg<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>bean<span class="token operator">&gt;</span>

<span class="token number">4.</span> 实例工厂方法：先注入工厂类，再工厂类方法实例化对象类。无参、有参
<span class="token operator">&lt;</span>bean id<span class="token operator">=</span><span class="token string">&quot;demoBeanFactory&quot;</span> class<span class="token operator">=</span><span class="token string">&quot;com.yh.demo.xx.DemoBeanFactory&quot;</span><span class="token operator">&gt;</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>bean<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>bean factory<span class="token operator">-</span>bean<span class="token operator">=</span><span class="token string">&quot;demoBeanFactory&quot;</span> factory<span class="token operator">-</span>method<span class="token operator">=</span><span class="token string">&quot;createDemo&quot;</span><span class="token operator">&gt;</span>
	<span class="token operator">&lt;</span>constructor<span class="token operator">-</span>arg index<span class="token operator">=</span><span class="token string">&quot;0&quot;</span> value<span class="token operator">=</span><span class="token string">&quot;name&quot;</span><span class="token operator">&gt;</span><span class="token operator">&lt;</span><span class="token operator">/</span>constructor<span class="token operator">-</span>arg<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>bean<span class="token operator">&gt;</span>

<span class="token number">4.1</span> 将工厂类实现统一接口，统一注入工厂类Bean
<span class="token operator">&lt;</span>bean id<span class="token operator">=</span><span class="token string">&quot;demoBeanFactory&quot;</span> class<span class="token operator">=</span><span class="token string">&quot;com.yh.demo.xx.DemoBeanFactory&quot;</span><span class="token operator">&gt;</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>bean<span class="token operator">&gt;</span>

注解方式。spring4<span class="token punctuation">.</span><span class="token number">0</span>后基本全替代xml方式
<span class="token number">1.</span> @Component及其派生的注解比如@Controller。需要@ComponentScan配置扫描路径
<span class="token number">2.</span> @Configuration加@Bean：注入当前配置类定义的bean。配合@Conditional系列注解，根据条件注入
<span class="token number">3.</span> @Configuration加@Import：引入其他类注入，尤其是配置类，实现批量注入。
<span class="token number">4.</span> @Configuration加@Import，引入ImportSelector接口实现类。starter包的EnableAutoConfiguration实现原理

public class DemoImportSelector implements ImportSelector <span class="token punctuation">{</span>
    @Override
    public String<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">selectImports</span><span class="token punctuation">(</span>AnnotationMetadata importingClassMetadata<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token builtin">new</span> String<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">{</span><span class="token string">&quot;com.yh.demo.xx.Demo1&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;com.yh.demo.xx.Demo2&quot;</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token number">5.</span> @Configuration加@Import，引入ImportBeanDefinitionRegistrar接口实现类，再注入前定义bean名称、作用域等属性

public class DemoImportSelector implements ImportBeanDefinitionRegistrar <span class="token punctuation">{</span>
    @Override
    public void <span class="token function">registerBeanDefinitions</span><span class="token punctuation">(</span>AnnotationMetadata importingClassMetadata<span class="token punctuation">,</span> BeanDefinitionRegistry registry<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        RootBeanDefinition demoBeanDefinition <span class="token operator">=</span> <span class="token builtin">new</span> <span class="token function">RootBeanDefinition</span><span class="token punctuation">(</span>Demo<span class="token punctuation">.</span>class<span class="token punctuation">)</span><span class="token punctuation">;</span>
        demoBeanDefinition<span class="token punctuation">.</span><span class="token function">setScope</span><span class="token punctuation">(</span>ConfigurableBeanFactory<span class="token punctuation">.</span>SCOPE_PROTOTYPE<span class="token punctuation">)</span><span class="token punctuation">;</span>
        registry<span class="token punctuation">.</span><span class="token function">registerBeanDefinition</span><span class="token punctuation">(</span><span class="token string">&quot;demo&quot;</span><span class="token punctuation">,</span> demoBeanDefinition<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token number">6.</span> BeanDefinitionRegistryPostProcessor接口和BeanFactoryPostProcessor接口，父子接口关系，都可注册

@Component
public class MyRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor <span class="token punctuation">{</span>
    @Override
    public void <span class="token function">postProcessBeanDefinitionRegistry</span><span class="token punctuation">(</span>BeanDefinitionRegistry registry<span class="token punctuation">)</span> throws BeansException <span class="token punctuation">{</span>
        RootBeanDefinition demoBeanDefinition <span class="token operator">=</span> <span class="token builtin">new</span> <span class="token function">RootBeanDefinition</span><span class="token punctuation">(</span>Demo<span class="token punctuation">.</span>class<span class="token punctuation">)</span><span class="token punctuation">;</span>
        registry<span class="token punctuation">.</span><span class="token function">registerBeanDefinition</span><span class="token punctuation">(</span><span class="token string">&quot;demo&quot;</span><span class="token punctuation">,</span> demoBeanDefinition<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    @Override
    public void <span class="token function">postProcessBeanFactory</span><span class="token punctuation">(</span>ConfigurableListableBeanFactory beanFactory<span class="token punctuation">)</span> throws BeansException <span class="token punctuation">{</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br></div></div><h3 id="mysql-锁"><a href="#mysql-锁" class="header-anchor">#</a> <a href="https://mp.weixin.qq.com/s/VjsQR_co2oM11EywegZrMw" target="_blank" rel="noopener noreferrer">MySQL 锁<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code><span class="token number">1.</span> MySQL InnoDB 的锁 和 MyISAM 的锁有什么区别？
MyISAM，仅支持表锁，InnoDB，支持表锁、行锁，写入操作性能高

<span class="token number">2.</span> 表锁、行锁的分类？
Shared Locks共享锁（S），支持多个事务同时获取
Exclusive Locks独占（排他）锁（X），仅一个事务，其他阻塞，与共享锁也阻塞

<span class="token number">3.</span> 事务读取记录是否需要获取共享锁？
<span class="token keyword">select</span><span class="token operator">...</span>lock in share mode<span class="token punctuation">;</span> 即需要S锁
<span class="token keyword">select</span><span class="token operator">...</span><span class="token keyword">for</span> update<span class="token punctuation">;</span> 即需要X锁
普通<span class="token keyword">select</span>，不需要锁，靠MVCC

<span class="token number">4.</span> 表锁应用场景？
一般用行锁足以，包括Alter table语句也是用MDL（metadata locks）阻塞操作。
适合数据恢复，手动锁表，再还原数据

<span class="token number">5.</span> 表锁和行锁是否会冲突？
会冲突！已有行锁，再加表锁，需要每条记录检查，性能差；
通过意向锁（Intention locks）判断，也分IS和IX，共享和独占，属于表级别；
即某记录加了S锁和X锁，则表加上IS或IX，这样加表锁前确认IS和IX是否存在，避免了表锁和行锁的同时存在

<span class="token number">6.</span> InnDB 有几类行锁？
记录锁（Record locks）、间隙锁（Gap locks）、Next<span class="token operator">-</span>Key Locks（记录锁<span class="token operator">+</span>间隙锁）

InnDB的表都有索引，即使没主键（主键索引），也会有隐藏的聚簇索引，默认是主键。
记录锁，只锁住索引记录，否则变为表锁。
	如A事务执行（SELECT <span class="token operator">*</span> FROM my_table WHERE name <span class="token operator">=</span> <span class="token string">'xx'</span> FOR UPDATE）。
		name有索引，即name<span class="token operator">=</span>xx的记录都加了行锁，这些不能删除、更新，也不能插入name<span class="token operator">=</span>xx的记录！
		name没有索引，也不是默认聚簇索引，A事务的锁变为表锁，该表中的其他SQL（增、删、改）都阻塞

间隙锁，防止其他事务插入数据到间隙中。比如记录id为<span class="token number">1</span>、<span class="token number">3</span>的间隙锁，插入id<span class="token operator">=</span><span class="token number">2</span>的数据被阻塞。防止幻读产生。
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br></div></div><h2 id="速记专业概念"><a href="#速记专业概念" class="header-anchor">#</a> 速记专业概念</h2> <h3 id="传参加密意义"><a href="#传参加密意义" class="header-anchor">#</a> 传参加密意义</h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code><span class="token number">1.</span> 优先HTTPS传输协议，保证客户端到服务端的数据加密。
<span class="token number">2.</span> 传参加密
	可有效避免【社会学攻击】（即知道了源密码去试不同网站，假设密码相同）。
	保护了源密码，但可用直接用密文登录，除非后端解密要求时效性。
	类似代码混淆，深入前端js的代码逻辑，可得知加密步骤
<span class="token number">3.</span> 所以重点在时效性验证，比如时间戳、验证码，一起传参验证
<span class="token number">4.</span> 是否生态需求选择
	比如Github的登录密码没有加密，可用模拟登录。可用扩展第三方应用
	比如Gitee的登录密码前端加密，无法模拟登录，但有时效性

注意区分，密码存储的加密方式
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h3 id="响应时间"><a href="#响应时间" class="header-anchor">#</a> 响应时间</h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code><span class="token number">1.</span> 响应时间是指系统对请求作出响应的时间。
<span class="token number">2.</span> 通常是指该系统所有功能的平均时间或者所有功能的最大响应时间。
<span class="token number">3.</span> 软件性能的高低实际上取决于用户对该响应时间的接受程度。
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h3 id="吞吐量"><a href="#吞吐量" class="header-anchor">#</a> 吞吐量</h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code><span class="token operator">-</span> 吞吐量Throughput是指系统在单位时间内处理请求的数量。
<span class="token operator">-</span> 并发系统，通常需要用吞吐量作为性能指标。
<span class="token operator">-</span> 单用户系统，响应时间（或者系统响应时间和应用延迟时间）可以很好地度量系统的性能。
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h3 id="并发用户数"><a href="#并发用户数" class="header-anchor">#</a> 并发用户数</h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code><span class="token operator">-</span> 并发用户数是指系统可以同时承载的正常使用系统功能的用户的数量。
<span class="token operator">-</span> 一个更直观但也更笼统的性能指标。以在线用户作为性能指标更直观些，而以同时发请求用户数作为性能指标更准确些。
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h3 id="qps每秒查询率"><a href="#qps每秒查询率" class="header-anchor">#</a> QPS每秒查询率</h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code><span class="token operator">-</span> 每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准
<span class="token operator">-</span> 即每秒的响应请求数，也即是最大吞吐能力
<span class="token operator">-</span> TPS，每秒事务数量， （单接口事务：发送请求、处理请求、响应请求），单接口情况下tps<span class="token operator">=</span>qps
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h3 id="java平台"><a href="#java平台" class="header-anchor">#</a> Java平台</h3> <div class="language-yaml line-numbers-mode"><pre class="language-yaml"><code>Java 分类：
  Java SE：标准版，之前叫J2SE
  Java EE：企业版，之前叫J2SE
  Java ME：微型版，之前叫J2SE
 
Java 应用包
  JDK是 Java SE SDK （Soft Development Kit) 软件开发工具包的扩展子包，针对java开发应用。
  JDK(Java Development Kit)，包含JRE，同时用于开发编译、调试等功能。
  JRE(Java Runtime Enviroment)，即java程序运行需要的环境包，其中包括Java虚拟机、Java平台核心类和支持文件。
  
Java 版本：
  最开始是JDK 1.1、1.2
  后改为J2SE 到 1.5 版本
  又改为J2SE 5、6
  J2SE、J2EE、J2ME 统一改为 Java SE、Java EE、Java ME
  所以JDK 1.8 就是 Java SE 8 简称 Java 8

Java 标准规范
  Java是个大平台，提供开发用的JDK，包括基础的类、标准接口等等，具体实现由第三方去扩展。
  比如JDK中：JMS消息服务、JDBC数据库连接、JTA事务API、XML可扩展标记语言、Java Servlet、JSP、JNDI、EJB
  这些都是Java的标准规范，每次JDK版本发布有一套对应的规范，大致规范变动不大，所以简化版本称呼。
  以上这个统称为Java SE规范，对应还有Java EE规范等等

  Java各种标准的制定是通过Java Community Process 组织即JCP发布的。
  JCP的成员可以根据需要提出Java Specification Request，即JSR。
  类似Github上的项目管理，请求分支合并。
  比如Java EE标准规范就是一组被通过的JSR的合集

</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br></div></div><h3 id="lru"><a href="#lru" class="header-anchor">#</a> LRU</h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code><span class="token operator">-</span> 算法：最不经常使用，Least Recently Used
<span class="token operator">-</span> 一般适用于缓存的算法
<span class="token operator">-</span> 存储的内存有限，所以存储的是相对价值高的数据，根据算法来更新更新内存中的数据。
<span class="token operator">-</span> 用最近一次使用的时间来衡量一块内存的价值，最近刚使用过，接着被用的概率相对高点
<span class="token operator">-</span> 此算法就是更新内存中最不经常使用的数据，相对来说不大可能被使用到的数据
<span class="token operator">-</span> 缓存功能：<span class="token number">1</span>、查询、<span class="token number">2</span>、更新，综合时间空间复杂度，数据结构应该是HasMap<span class="token operator">+</span>LinkedList
<span class="token operator">-</span> HasMap，key：查询key，value：链表节点；
<span class="token operator">-</span> 链表，假设头部为旧数据，尾部为新数据
<span class="token operator">-</span> 情况分析：
  <span class="token operator">-</span> 查询
    <span class="token number">1.</span> 查不到key，返回空
    <span class="token number">2.</span> 查到key，value在链表中移动到尾部（即，先删除节点，再插入节点）
  <span class="token operator">-</span> 更新
    <span class="token number">1.</span> 已存在，更新HashMap值，链表移动，参考查询<span class="token number">2</span>
    <span class="token number">2.</span> 不存在
      <span class="token operator">-</span> 缓存的内存还没到上限，直接插入链表尾部
      <span class="token operator">-</span> 缓存的内存已到上限，删除头<span class="token number">1</span>，再插入链表尾部，同时删除HashMap的key
<span class="token operator">-</span> 以上分析，用相关语言实现，注意链表要自己实现，HashMap就是最终的LRU
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br></div></div><h3 id="clickhouse"><a href="#clickhouse" class="header-anchor">#</a> clickHouse</h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code><span class="token operator">-</span>  Yandex（俄罗斯最大的搜索引擎）的开源<span class="token operator">*</span><span class="token operator">*</span>列式<span class="token operator">*</span><span class="token operator">*</span>数据库。
<span class="token operator">-</span> 对比传统<span class="token operator">*</span><span class="token operator">*</span>行式<span class="token operator">*</span><span class="token operator">*</span>存储数据库（OLTP），处理速度快<span class="token number">100</span><span class="token operator">-</span><span class="token number">1000</span> ，适用于数据分析（OLAP）
<span class="token operator">-</span> OLAP场景特点：
  <span class="token operator">-</span> 读大于写
  <span class="token operator">-</span> 大宽表，读大量行但是少量列，结果集较小
  <span class="token operator">-</span> 数据批量写入，且数据不更新或少更新
  <span class="token operator">-</span> 无需事务，数据一致性要求低
  <span class="token operator">-</span> 灵活多变，不适合预先建模
<span class="token operator">-</span> <span class="token operator">*</span><span class="token operator">*</span>列式<span class="token operator">*</span><span class="token operator">*</span>数据库优点
  <span class="token operator">-</span> 只需要读取要计算的列数据，而非行式的整行数据读取，降低 IO cost。
  <span class="token operator">-</span> 同列同类型，有十倍压缩提升，进一步降低 IO。
  <span class="token operator">-</span> 根据不同存储场景，做个性化搜索算法。
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><h3 id="服务器"><a href="#服务器" class="header-anchor">#</a> 服务器</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>单台服务器并发参考，默认未优化下

高并发，基于内存、缓存，

- tomcat：1000+
- apache：200-300
- weblogic：3000+
- nginx：几万+
- openResty：百万+，调优

&gt; 以上仅限于http服务器的高并发接受量
&gt;
&gt; 业务请求综合考虑：网络 + http服务器 + http到后端通信 + 后端 + 后端到数据库通信 + 数据库
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><h3 id="java语法糖"><a href="#java语法糖" class="header-anchor">#</a> JAVA语法糖</h3> <ul><li><p>try-with-resource替代IOUtils.closeQuietly(out)</p> <div class="language-java line-numbers-mode"><pre class="language-java"><code> <span class="token keyword">try</span> <span class="token punctuation">(</span>
     <span class="token class-name">ExcelWriter</span> writer <span class="token operator">=</span> <span class="token class-name">ExcelUtil</span><span class="token punctuation">.</span><span class="token function">getWriter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token class-name">ByteArrayOutputStream</span> output <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
 <span class="token punctuation">)</span> <span class="token punctuation">{</span>
     <span class="token comment">// todo， 直到IO流對象使用結束</span>

 <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token comment">// 需要获取异常的话，参考如下</span>
   <span class="token comment">// 获取语法糖中的”异常抑制“，而closeQuietly无法获取内部异常</span>
   <span class="token class-name">Throwable</span><span class="token punctuation">[</span><span class="token punctuation">]</span> suppressed <span class="token operator">=</span> e<span class="token punctuation">.</span><span class="token function">getSuppressed</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Throwable</span> throwable <span class="token operator">:</span> suppressed<span class="token punctuation">)</span> <span class="token punctuation">{</span>
         log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">&quot;&quot;</span><span class="token punctuation">,</span> throwable<span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token punctuation">}</span>
     <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">RuntimeException</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span>
 <span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div></li></ul> <h3 id="mom"><a href="#mom" class="header-anchor">#</a> MOM</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>面向消息中间，技术思想，保证消息发送
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="jms"><a href="#jms" class="header-anchor">#</a> JMS</h3> <ul><li><p>Java技术规范，协议，类似JDBC，为消息通信定义了规范接口</p></li> <li><p>规范的概念有</p> <div class="language-yaml line-numbers-mode"><pre class="language-yaml"><code><span class="token key atrule">Provider(MessageProvider)</span><span class="token punctuation">:</span> 生产者
<span class="token key atrule">Consumer(MessageConsumer)</span><span class="token punctuation">:</span> 消费者
<span class="token key atrule">PTP</span><span class="token punctuation">:</span> Point to Point，点对点的消息模型，一个消息只能被一个消费者消费
<span class="token key atrule">Pub/Sub</span><span class="token punctuation">:</span> publish/Subscribe，发布/订阅的消息模型，一个消费被所有订阅的消费者消费
<span class="token key atrule">ConnectionFactory</span><span class="token punctuation">:</span> 连接工厂，创建连接
<span class="token key atrule">Connection</span><span class="token punctuation">:</span> 客户端到Provider的连接
<span class="token key atrule">Destination</span><span class="token punctuation">:</span> 消息的目的地
    <span class="token key atrule">Queue</span><span class="token punctuation">:</span> 队列目标
    <span class="token key atrule">Topic</span><span class="token punctuation">:</span> 主题目标
<span class="token key atrule">Session</span><span class="token punctuation">:</span> 会话，一个发送或者接受的线程
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div></li></ul> <h3 id="mq"><a href="#mq" class="header-anchor">#</a> MQ</h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code><span class="token operator">-</span> MOM的实现产品，消息队列的应用

<span class="token operator">-</span> 基于JMS实现的有ActiveMQ、Redis、RabbitMQ

<span class="token operator">-</span> 基于AMQP实现的有Rabbitmq、Kafka
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><h3 id="安全防护"><a href="#安全防护" class="header-anchor">#</a> 安全防护</h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code>点击挟持防护设置：X<span class="token operator">-</span>Frame<span class="token operator">-</span>Options
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="cap"><a href="#cap" class="header-anchor">#</a> CAP</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>1、针对分布式环境的理论
2、保证可用性，一个a节点数据会有N个副本，数据同步到另个b节点一般用复制形式。
3、因某原因无法同步，ab两节点数据就形成隔离，即分区容错性P(partition)
4、解决这个现象，两种选择
5、可用性 A(Availability)，即b点还可用，但数据不保证最新，没有即使同步a的数据
6、一致性C(Consistency)，即b点等待响应，直到数据同步完成
例子：
1、服务注册中心，需要记录各个微服务节点信息，会自动同步更新节点信息
2、Eureka，完全AP，同个服务可以注册多个eureka中，即注册中心集群
3、Zookeeper，完全CP
4、Nacos，支持AP或CP，集成配置中心
5、数据库读写分离
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><h3 id="iis"><a href="#iis" class="header-anchor">#</a> IIS</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>	微软的互联网信息服务，可做服务器使用，发布项目
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="docker"><a href="#docker" class="header-anchor">#</a> docker</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>	前提：
​	1、软件在不同环境部署的困难和麻烦
​	2、虚拟机解决以上问题，但缺点明显，启动慢、占资源、步骤多
​	3、Linux容器，虚拟化技术，非完整操作系统，仅针对进程隔离，相对虚拟机有优点
​	作用：
​	1、是linux容器的二次封装，即解决方案，提供简单接口使用
​	1、提供一次性环境、提供弹性的云服务、组件微服务架构
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><h3 id="springboot特征"><a href="#springboot特征" class="header-anchor">#</a> SpringBoot特征</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>（1）可以创建独立的Spring应用程序，并且基于其Maven或Gradle插件，可以创建可执行的JARs和WARs；
（2）内嵌Tomcat或Jetty等Servlet容器；
（3）提供自动配置的“starter”项目对象模型（POMS）以简化Maven配置；
（4）尽可能自动配置Spring容器；
（5）提供准备好的特性，如指标、健康检查和外部化配置；
（6）绝对没有代码生成，不需要XML配置。
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><h3 id="sass"><a href="#sass" class="header-anchor">#</a> sass</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>	css预处理语言，同类的还有less
​	第三代开始大改进，又称为scss
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h3 id="sql"><a href="#sql" class="header-anchor">#</a> SQL</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>	limit 与 offset区别及并用
​	limit y 分句表示: 读取 y 条数据
​	limit x, y 分句表示: 跳过 x 条数据，读取 y 条数据
​	limit y offset x 分句表示: 跳过 x 条数据，读取 y 条数据
​	从第20个开始，获取20条数据：limit 20 offset 20 等于 limit 20, 20; 
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><h3 id="activity"><a href="#activity" class="header-anchor">#</a> activity</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>开源工作流引擎，面向业务人员
​	加载设计好的流程定义由引擎处理，通过引擎的api来获取流程节点信息，便于管理流程业务
​	将流程方面的代码逻辑分离由引擎管理，让开发更侧重于业务，简化流程逻辑
​	实现了BPMN 2.0规范的流程定义，文件格式有
​	例如：请假流程
​	BPMN（Business Process Model Notation） 业务流程模型与符号	
​		2.0规范，一套流程建模的标准，即画流程模型的规范，利用易理解的符号
​	应用：BPM系统（业务流程管理），类似 EPR系统（资源管理），OA系统（人力资源管理）
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><h3 id="nacos​"><a href="#nacos​" class="header-anchor">#</a> Nacos​</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>	功能：服务发现管理、动态配置管理、动态DNS管理
​	作为Spring Cloud Alibaba 新的微服务开源框架主要组件之一
​	ps：Sping Cloud Netflix 系列不再开源维护 
​	好处：独立服务、支持多种框架集成、中文文档易上手
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><h3 id="activemq"><a href="#activemq" class="header-anchor">#</a> activeMQ</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>	Apache开源的消息中间件产品，支持JMS1.1和J2EE规范
​	扩展
​		消息中间件（作用是解耦和异步），关注于数据的发送和接收，利用高效可靠的异步消息机制传递机制集成分布式系统。
​		AMOP（Advanced Message Queuing Protocol），定义消息服务标准的传输层协议
​		JMP（Java Message Service），java平台的消息服务通用API，技术规范，类似JDBC
​			主要元素概念：提供者、客户、生产者、消费者、消息、队列、主题
​	插件：hawtio，H5可视化管理页面（比自带的管理界面功能丰富），也支持其他消息中间件
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><h3 id="zookeeper"><a href="#zookeeper" class="header-anchor">#</a> zookeeper</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>主要服务于分布式系统
​	应用：统一配置管理、统一命名服务、分布式锁、集群管理
​	数据结构：
​		树形态，节点概念(Znode)
​		节点，一个连接创建一个节点，分：
​			短暂（断开连接，节点删除）
​			持久（断开连接，节点不删除）
​	监听器：
​		监听节点数据变化
​		监听子节点的增减变化
​	分布式锁例子：
​		一个应用访问创建一个短暂性节点，带编号，并监听子节点的增减变化；
​		判断规则以最大或最小的编号，为当前获取锁的依据；
​		释放锁，当前节点删除，最大（小）编号发生变化，子节点发生增减变化；
​		其他应用访问创建的节点监听到变化，重新判断，最大（小）的获取锁；
​	模式：
​		独立（单机)模式
​		仲裁（集群）模式：法定人数概念，建议集群数为奇数，如5台服务器，法定为3台，数据同步了3台就可响应客户端，即使崩溃2台，还能拿保证有一台可用；
​	技术问题：
​		1、启动失败？
​			参考zkEnv配置脚本，确定是否为zoo.cfg配置文件
​			java环境变量路径最后是否有多余的斜杆
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br></div></div><h3 id="geoserver"><a href="#geoserver" class="header-anchor">#</a> geoServer</h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code>发布地图服务的服务器
	安装社区插件：
		下载与geoserver对应的插件版本；
		一般是jar的压缩包，解压到geoserver安装目录的<span class="token operator">...</span>\webapps\geoserver\WEB<span class="token operator">-</span>INF\lib下
		重启服务，ok
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><h3 id="postgresql"><a href="#postgresql" class="header-anchor">#</a> postgreSql</h3> <div class="language- extra-class"><pre><code>关系型数据库，开源，支持空间数据类型
linux安装教程
	1、官方平台选择版本，根据推荐的命令1-7步执行
	2、最后一步（第7步）是初始化数据库，目录在/var/lib/pgsql/版本/
	3、在/var/lib/pgsql/版本/data/下，
		修改postgresql.conf配置的listen_addresses=*
		修改pg_hba.conf配置的远程访问限制，【host	all	all	0.0.0.0/0	md5】表示所有ip都可以访问，md5密码认证
</code></pre></div><h3 id="webservice"><a href="#webservice" class="header-anchor">#</a> webservice</h3> <div class="language- extra-class"><pre><code>Webservice是一个平台独立的，低耦合的，自包含的、基于可编程的web的应用程序
一个跨语言、跨平台的规范
基于SOAP协议，区别于http协议，一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据
WSDL是webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程
一个apache的用于开发webservice服务器端和客户端的框架
</code></pre></div><h3 id="ldap"><a href="#ldap" class="header-anchor">#</a> LDAP：</h3> <div class="language- extra-class"><pre><code>一种通讯协议，支持TCP/IP。协议就是标准，是抽象的。
LDAP是一种开放Internet标准，跨平台的Interent协议。
通常说法，就是指运行这个数据库的服务器，即存储数据的数据库。
区别于关系型数据库，是树型结构的存储数据，树形展示数据。
server/client模型：服务器存储数据，客户端操作信息树。
以此标准开发的产品，比如AD，微软实现的LDAP。
优势，静态数据查询快，（关系型数据库的索引原理就是B树）
连接工具有ApacheDirectoryStudio，相当于Navicat
编程连接方式有：JDBC、JNDI（推荐）
</code></pre></div><h3 id="jetty"><a href="#jetty" class="header-anchor">#</a> jetty</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>	同tomcat一样是个servlet容器，运行web项目；相比更轻量级。
	嵌项目中，通过maven搭建启动项目，效果类似springboot内嵌tomcat
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h3 id="react"><a href="#react" class="header-anchor">#</a> React</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>	用于构建界面的js库
	定义的语法糖叫 JSX，即JS结合XML的模板
	基本使用：官方文档的核心概念
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h3 id="redux"><a href="#redux" class="header-anchor">#</a> Redux</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>js的状态容器，做状态管理，类似观察者模式或订阅发布模式
	核心概念：
		store：一个Redux一个store，可看做状态容器对象，通过该对象操作状态数据
		state：存储状态数据，类型可为基本类型、数组、对象
		action：描述发生了什么，有利于日志、调式等等
		reducer：一个纯函数，接收旧的state和action，处理后返回新的state对象
	注意：state是只读，所以只能通过action触发reducer更新数据并返回新的state对象
	适用：任何框架
	数据流：单向
	对比：
		Vuex：简化版Redux，简化了部分定义，Vue框架专门的状态容器(双向数据流）
	store的应用:
		提供 getState() 方法获取 state；
		提供 dispatch(action) 方法更新 state；
		通过 subscribe(listener) 注册监听器;
		通过 subscribe(listener) 返回的函数注销监听器。	
	目录结构
		1、
		--redux
		--------store.js
		--------modules
		----------m1.js		//包含state、reducer、action、mapStateToProp（react-redux的connect的过滤方法）
		----------m2.js
		2、
		--store
		--------store.js	//标准store，通过此处的构造函数返回store
		--actions
		----------a1.js		//按组件命名action
		----------a2.js
		--reducer
		----------r1.js		//按组件命名reducer
		----------r2.js
		其他直接在组件jsx里定义
	衍生中间件
		React-Redux：配合Redux使用
		reselect：缓存state，redux的性能优化；正常state发生变化，会触发所有的reducer；reselect为某组件的state做了个缓存，根据参数函数判断是否触发变化重新渲染；类似vue的computed
				
React—Redux：
	1、绑定store对象
	&lt;Provider store={store}&gt;
		根组件
	&lt;/Provider&gt;
	2、组件订阅store
	connect()
		参数1：
			对象：从store中筛选返回当前组件所需的state，作为props属性；	类似Vuex的mapGetters
			函数：在筛选的state属性做个函数处理（比如过滤）再返回
				参数1：state
				参数2: ownProps
		参数2：从store中筛选返回当前组件所需的action，作为事件操作, 触发方式props.dispatch(action)


1、React官方文档的核心概念1-12
https://zh-hans.reactjs.org/docs/hello-world.html
2、Redux官方文档：介绍（核心概念、三大原则）、基础（Action、Reducer、Store）
https://www.redux.org.cn/
3、React—Redux官方文档：介绍、API
https://react-redux.js.org/introduction/quick-start
4、Mapstore项目例子，web/client/examples/my
5、Mapstore项目文档，插件开发
   https://mapstore.readthedocs.io/en/latest/developer-guide/developing-with-mapstore-2-intro/
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br></div></div><h3 id="语法糖"><a href="#语法糖" class="header-anchor">#</a> 语法糖</h3> <div class="language-go line-numbers-mode"><pre class="language-go"><code>糖衣语法，拟定的语法，便于书写、可读、提高效率等等，编译后会还原成虚拟机的基础语法
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="tomcat"><a href="#tomcat" class="header-anchor">#</a> tomcat</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>	1、下载解压版
	2、乱码问题，系统、服务编码不统一导致，建议都改为UTF-8
		1、添加（修改）启动java参数，-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
		2、若启动日志乱码，\conf\logging.properties中java.util.logging.ConsoleHandler.encoding修改UTF-8为GBK(仅限window本地使用）
	3、多个tomcat
		修改端口，server.xml配置对应的8005、8080、8009
		若没有配置环境变量，直接可用。原理 startup脚本调用catalina脚本，找tomcat环境变量，没有就默认取当前目录。
	4、启动缓存报错
		修改conf下的context.xml，填下如下代码
		&lt;!-- 默认开启缓存，提示缓存不够时，可以设置缓存大小，或关闭缓存 --&gt;
		&lt;Resources cachingAllowed=&quot;false&quot;&gt;&lt;/Resources&gt;
		&lt;!-- &lt;Resources cachingAllowed=&quot;true&quot; cacheMaxSize=&quot;100000&quot; /&gt; --&gt;
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><h3 id="maven"><a href="#maven" class="header-anchor">#</a> maven</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>命令
		package：打包
		install：打包，并添加到本地仓库
	分布式项目，各服务打包方式为jar，引用这些服务时，需本地先install，否则去仓库下载会到导致下载失败（除非远程仓库有相应的jar）
	profie激活方式
		1、pom中activeByDefault激活
		&lt;activation&gt; 
            &lt;activeByDefault&gt;true&lt;/activeByDefault&gt; 
        &lt;/activation&gt; 
		2、settings.xml中activeProfiles激活，
		&lt;activeProfiles&gt; 
			&lt;activeProfile&gt;profileTest1&lt;/activeProfile&gt; 
			&lt;activeProfile&gt;profileTest2&lt;/activeProfile&gt; 
		&lt;/activeProfiles&gt;
		3、maven命令参数-P激活
		mvn package –P profileTest1
		4、根据环境来激活profile
		&lt;profile&gt; 
			&lt;id&gt;profileTest1&lt;/id&gt; 
			&lt;jdk&gt;1.5&lt;/jdk&gt; 
		&lt;/profile&gt;
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br></div></div><h3 id="跨域方案"><a href="#跨域方案" class="header-anchor">#</a> 跨域方案</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>	1、前端代理，webpack-dev-server只支持开发环境
	2、nginx
	3、后端服务代理，url做参数发送到后端，用httpclient的proxy功能做请求，再响应给前端
	4、请求服务端配置跨域允许（本质）
		响应头：Access-Control-Allow-Origin=*
		请求头：origin=请求的host
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><h3 id="webpack"><a href="#webpack" class="header-anchor">#</a> webpack</h3> <div class="language- line-numbers-mode"><pre class="language-text"><code>配置
	entry，配置要打包的js（value）以及打包后的命名(key)
	output，配置打包后js存在路径，使用entry的key就取[name].js
	plugins：引用插件实现额外的功能，常用如下
		ExtractTextPlugin：单独分离css单独打包，通过link引入，否则css样式会打包在js以style标签直接加载head中
		HtmlWebpackPlugin：生成html入口文件；为html文件外部资源文件，如script、link动态添加每次compile后的hash，防止引用缓存的外部文件问题
		DefinePlugin：添加配置文件，构建期间自动检测环境变化
		ParallelUglifyPlugin：压缩插件多线程并行压缩，wabpack默认是单线程压缩，
    module: webpack默认只能处理js文件，其他文件需要通过loader加载，以下是模块加载规则定义
		noParse: [/html2canvas/], //忽略js，比较JQuery之类的没有模块且比较大的文件
		rules: [{
                //正则匹配某类型文件,test、
                test: /\.jsx?$/,
                //默认搜索编译的所有的文件，所以排除node_modules目录下文件
                exclude: /node_modules/,
                //指定用什么loader加载，可配置多个,支持对象，或直接loader的字符串
                use: [{
                    loader: &quot;babel-loader&quot;,
                    options: {
                        cacheDirectory: true,
                    },
                }],
                // include:
            }]
	
写法	
	require同步加载
	require.ensure 异步加载js
	require('./')	当前目录
	require('../') 	父目录
	require('path')	node的核心模块或第三方模块;引用的是文件夹，默认找目录下的index.js
内存溢出 
	全局安装increase-memory-limit
	npm install -g increase-memory-limit
	进入工程目录，执行：
	increase-memory-limit
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br></div></div></div> <footer class="page-edit" style="display:none;"><!----> <div class="last-updated"><span class="prefix">Last Updated: </span> <span class="time">2021/12/1 下午2:07:28</span></div></footer> <!----> <!----></main> <!----></div></div></div></div><div class="global-ui"><div class="back-to-ceiling" style="right:1rem;bottom:6rem;width:2.5rem;height:2.5rem;border-radius:.25rem;line-height:2.5rem;display:none;" data-v-c6073ba8 data-v-c6073ba8><svg t="1574745035067" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5404" class="icon" data-v-c6073ba8><path d="M526.60727968 10.90185116a27.675 27.675 0 0 0-29.21455937 0c-131.36607665 82.28402758-218.69155461 228.01873535-218.69155402 394.07834331a462.20625001 462.20625001 0 0 0 5.36959153 69.94390903c1.00431239 6.55289093-0.34802892 13.13561351-3.76865779 18.80351572-32.63518765 54.11355614-51.75690182 118.55860487-51.7569018 187.94566865a371.06718723 371.06718723 0 0 0 11.50484808 91.98906777c6.53300375 25.50556257 41.68394495 28.14064038 52.69160883 4.22606766 17.37162448-37.73630017 42.14135425-72.50938081 72.80769204-103.21549295 2.18761121 3.04276886 4.15646224 6.24463696 6.40373557 9.22774369a1871.4375 1871.4375 0 0 0 140.04691725 5.34970492 1866.36093723 1866.36093723 0 0 0 140.04691723-5.34970492c2.24727335-2.98310674 4.21612437-6.18497483 6.3937923-9.2178004 30.66633723 30.70611158 55.4360664 65.4791928 72.80769147 103.21549355 11.00766384 23.91457269 46.15860503 21.27949489 52.69160879-4.22606768a371.15156223 371.15156223 0 0 0 11.514792-91.99901164c0-69.36717486-19.13165746-133.82216804-51.75690182-187.92578088-3.42062944-5.66790279-4.76302748-12.26056868-3.76865837-18.80351632a462.20625001 462.20625001 0 0 0 5.36959269-69.943909c-0.00994388-166.08943902-87.32547796-311.81420293-218.6915546-394.09823051zM605.93803103 357.87693858a93.93749974 93.93749974 0 1 1-187.89594924 6.1e-7 93.93749974 93.93749974 0 0 1 187.89594924-6.1e-7z" p-id="5405" data-v-c6073ba8></path><path d="M429.50777625 765.63860547C429.50777625 803.39355007 466.44236686 1000.39046097 512.00932183 1000.39046097c45.56695499 0 82.4922232-197.00623328 82.5015456-234.7518555 0-37.75494459-36.9345906-68.35043303-82.4922232-68.34111062-45.57627738-0.00932239-82.52019037 30.59548842-82.51086798 68.34111062z" p-id="5406" data-v-c6073ba8></path></svg></div></div></div>
    <script src="/blog/assets/js/app.0c46c7d8.js" defer></script><script src="/blog/assets/js/3.5679fe00.js" defer></script><script src="/blog/assets/js/1.8cdd2163.js" defer></script><script src="/blog/assets/js/33.e08324f8.js" defer></script>
  </body>
</html>
